package com.twq.collection.list

/**
 * Created by tangweiqun on 2017/12/10.
 */
object Pattern {
  def main(args: Array[String]): Unit = {
    val fruit = List("apples", "oranges", "pears")

    //1、这个List pattern知道List只含有3个元素，并且将每一个元素的值绑定到对应的变量上
    //可以这么用，是因为List伴生对象中定义了unapplySeq方法(即List伴生对象是一个萃取器)
    val List(a, b, c) = fruit

    //2、当我们不知道List的长度的时候，我们可以用如下这种模式
    //x :: xs 是一种插入运算模式，
    // 如果作为表达式的话，则::表示一个方法的调用
    // 但是如果作为模式的话，则 :: 表示一个类，下面的模式其实可以描述为::(first, second, rest)
    // 也就是说 :: 被是作为constructor pattern了
    val first :: second :: rest = fruit

    //所以 :: 在scala中出现了两次，一次是作为List中的方法，一次是作为scala包里的类


    //3、对于List的分解，一般都是用模式匹配来做，比用方法做更加的清晰点
    def headAddOne(xs: List[Int]): List[Int] = xs match {
      case List() => Nil
      case head :: tail => (head + 1) :: tail
    }
  }
}
